package com.tlgen.orm.utils.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

public class FileUtils {

    // 文件列表缓存（提高遍历性能）
    private static final ConcurrentMap<Path, List<File>> FILE_LIST_CACHE = new ConcurrentHashMap<>();

    // 读取文件内容
    public static String readFile(File file) {
        StringBuilder text = new StringBuilder();
        String encoding = "utf-8";
        try (InputStreamReader read = new InputStreamReader(Files.newInputStream(file.toPath()), encoding);
             BufferedReader bufferedReader = new BufferedReader(read)) {
            //判断文件是否存在
            if (file.isFile() && file.exists()) {
                String lineTxt;
                while ((lineTxt = bufferedReader.readLine()) != null) {
                    text.append(lineTxt).append("\n");
                }
            } else {
                throw new RuntimeException("找不到指定的文件!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return text.toString();
    }

    // 递归获取目录下的所有文件
    public static void getAllFile(File file, List<File> fileList) {
        if (file == null || !file.exists()) {
            return;
        }

        if (file.isDirectory()) {
            // 检查目录缓存
            Path dirPath = file.toPath();
            List<File> cachedFiles = FILE_LIST_CACHE.get(dirPath);
            if (cachedFiles != null) {
                fileList.addAll(cachedFiles);
                return;
            }

            // 获取目录下的文件列表
            File[] files = file.listFiles();
            if (files == null) {
                return;
            }

            List<File> dirFiles = new ArrayList<>();
            for (File f : files) {
                if (f.isDirectory()) {
                    getAllFile(f, dirFiles);
                } else {
                    dirFiles.add(f);
                }
            }

            // 缓存结果
            FILE_LIST_CACHE.put(dirPath, dirFiles);
            fileList.addAll(dirFiles);
        } else {
            fileList.add(file);
        }
    }

    // 获取当前目录下的所有文件（递归）
    public static void getAllFile(List<File> fileList) {
        String localDirectory = System.getProperty("user.dir");
        File rootDir = new File(localDirectory);
        getAllFile(rootDir, fileList);
    }

}